
#include <ql/alloc.h>

#include <stdlib.h>
#include <string.h>
#include <assert.h>

#if defined(QL_ENABLE_MEM_DEBUG)

#if defined(_MSC_VER)

void * ql_dbg_mallocz_impl( size_t s, const char * file, int line )
{
    void * p = _malloc_dbg( s, _NORMAL_BLOCK, file, line );
    if( p ) memset( p, 0, s );
    return p;
}

void ql_dump_mem_leaks()
{
    _CrtDumpMemoryLeaks();
}

#else

#error TODO - implementation of dbg alloc

#endif

#else // !QL_ENABLE_MEM_DEBUG

void * ql_malloc(size_t size)
{
    void * p = malloc(size);
    if (!p)
    {
        assert(!"not enough memory");
        abort();
    }

    return p;
}

void * ql_mallocz(size_t size)
{
    void * p = malloc(size);
    if (!p)
    {
        assert(!"not enough memory");
        abort();
    }

    memset(p, 0, size);
    return p;
}

void * ql_realloc(void * ptr, size_t size)
{
    void * p = realloc(ptr, size);
    if( !p && !size )
    {
        assert(!"not enough memory");
        abort();
    }

    return p;
}

void ql_free(void * ptr)
{
    free(ptr);
}

#endif // !QL_DBG_MEM_IMPL
